home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / RCS / fcntl.c,v < prev    next >
Text File  |  1991-12-10  |  5KB  |  294 lines

  1. head     1.4;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.4.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.4
  10. date     91.12.04.14.43.13;  author jhh;  state Exp;
  11. branches 1.4.1.1;
  12. next     1.3;
  13.  
  14. 1.3
  15. date     88.07.29.18.39.23;  author ouster;  state Exp;
  16. branches ;
  17. next     1.2;
  18.  
  19. 1.2
  20. date     88.07.29.17.39.22;  author ouster;  state Exp;
  21. branches ;
  22. next     1.1;
  23.  
  24. 1.1
  25. date     88.06.19.14.31.16;  author ouster;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29. 1.4.1.1
  30. date     91.12.10.15.46.11;  author kupfer;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @@
  37.  
  38.  
  39. 1.4
  40. log
  41. @added O_RDONLY, O_WRONLY, and O_RDWR to the flags. Also changed it
  42. to use IOC_SET_FLAGS instead of IOC_SET_BITS so that flags can
  43. be turned off
  44. @
  45. text
  46. @/* 
  47.  * fcntl.c --
  48.  *
  49.  *    Procedure to map the Unix fcntl system call to Sprite.
  50.  *
  51.  * Copyright 1986 Regents of the University of California
  52.  * All rights reserved.
  53.  */
  54.  
  55. #ifndef lint
  56. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/fcntl.c,v 1.3 88/07/29 18:39:23 ouster Exp Locker: jhh $ SPRITE (Berkeley)";
  57. #endif not lint
  58.  
  59. #include "sprite.h"
  60. #include "fs.h"
  61.  
  62. #include "compatInt.h"
  63.  
  64. #include <fcntl.h>
  65. #include <stdio.h>
  66.  
  67. /*
  68.  *----------------------------------------------------------------------
  69.  *
  70.  * fcntl --
  71.  *
  72.  *    Procedure to map from Unix fcntl system call to Sprite Fs_IOControl.
  73.  *
  74.  * Results:
  75.  *    a value depending on the command, or
  76.  *      UNIX_SUCCESS     the call was successful, or
  77.  *      UNIX_ERROR       the call was not successful.
  78.  *                        The actual error code stored in errno.
  79.  *
  80.  * Side effects:
  81.  *    Variable.
  82.  *
  83.  *----------------------------------------------------------------------
  84.  */
  85.  
  86. int
  87. fcntl(fd, cmd, arg)
  88.     int fd;        /* File to operate on. */
  89.     int cmd;        /* Type of command. */
  90.     int arg;        /* Optional argument to the command. */
  91. {
  92.     ReturnStatus status;
  93.     int value;
  94.  
  95.     switch (cmd) {
  96.     case F_DUPFD:
  97.         status = Fs_GetNewID(fd, &arg);
  98.         value = arg;
  99.         break;
  100.  
  101.     case F_GETFD:
  102.         status = Fs_IOControl(fd, IOC_GET_FLAGS, 
  103.                 0, (Address) NULL, 
  104.                 sizeof(value), (Address) &value);
  105.         value = (value & IOC_CLOSE_ON_EXEC) ? 1 : 0;
  106.         break;
  107.  
  108.     case F_SETFD:
  109.         value = IOC_CLOSE_ON_EXEC;
  110.         if (arg & 1) {
  111.         status = Fs_IOControl(fd, IOC_SET_BITS, 
  112.                 sizeof(value), (Address) &value,
  113.                 0, (Address) NULL);
  114.         } else {
  115.         status = Fs_IOControl(fd, IOC_CLEAR_BITS, 
  116.                 sizeof(value), (Address) &value,
  117.                 0, (Address) NULL);
  118.         }
  119.         value = UNIX_SUCCESS;
  120.         break;
  121.  
  122.     case F_GETFL:  {
  123.         int temp;
  124.  
  125.         status = Fs_IOControl(fd, IOC_GET_FLAGS, 
  126.                 0, (Address) NULL, 
  127.                 sizeof(temp), (Address) &temp);
  128.         value = 0;
  129.         if (temp & IOC_APPEND) {
  130.             value |= FAPPEND;
  131.         }
  132.         if (temp & IOC_NON_BLOCKING) {
  133.             value |= FNDELAY;
  134.         }
  135.         if (temp & IOC_ASYNCHRONOUS) {
  136.             value |= FASYNC;
  137.         }
  138.         switch(temp & (IOC_READ | IOC_WRITE)) {
  139.             case IOC_READ :
  140.             value |= O_RDONLY;
  141.             break;
  142.             case IOC_WRITE:
  143.             value |= O_WRONLY;
  144.             break;
  145.             case (IOC_READ | IOC_WRITE) :
  146.             value |= O_RDWR;
  147.             break;
  148.         }
  149.         }
  150.         break;
  151.  
  152.     case F_SETFL:
  153.         value = 0;
  154.         if (arg & FAPPEND) {
  155.         value |= IOC_APPEND;
  156.         }
  157.         if (arg & FNDELAY) {
  158.         value |= IOC_NON_BLOCKING;
  159.         }
  160.         if (arg & FASYNC) {
  161.         value |= IOC_ASYNCHRONOUS;
  162.         }
  163.         status = Fs_IOControl(fd, IOC_SET_FLAGS, 
  164.             sizeof(value), (Address) &value,
  165.             0, (Address) NULL);
  166.         value = UNIX_SUCCESS;
  167.         break;
  168.  
  169.     case F_GETOWN: {
  170.         Ioc_Owner owner;
  171.  
  172.         status = Fs_IOControl(fd, IOC_GET_OWNER, 
  173.                 0, (Address) NULL,
  174.                 sizeof(owner), (Address) &owner);
  175.         if (owner.procOrFamily == IOC_OWNER_FAMILY) {
  176.             value = -owner.id;
  177.         } else {
  178.             value = owner.id;
  179.         }
  180.         }
  181.         break;
  182.  
  183.     case F_SETOWN: {
  184.         Ioc_Owner owner;
  185.  
  186.         if (arg < 0) {
  187.             owner.id = -arg;
  188.             owner.procOrFamily = IOC_OWNER_FAMILY;
  189.         } else {
  190.             owner.id = arg;
  191.             owner.procOrFamily = IOC_OWNER_PROC;
  192.         }
  193.         status = Fs_IOControl(fd, IOC_SET_OWNER, 
  194.                 sizeof(owner), (Address) &owner,
  195.                 0, (Address) NULL);
  196.         value = UNIX_SUCCESS;
  197.         }
  198.         break;
  199.  
  200.     default:
  201.         break;
  202.     }
  203.     if (status != SUCCESS) {
  204.     errno = Compat_MapCode(status);
  205.     return(UNIX_ERROR);
  206.     } 
  207.     return(value);
  208. }
  209. @
  210.  
  211.  
  212. 1.4.1.1
  213. log
  214. @Initial branch for Sprite server.
  215. @
  216. text
  217. @d11 1
  218. a11 1
  219. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/fcntl.c,v 1.4 91/12/04 14:43:13 jhh Exp $ SPRITE (Berkeley)";
  220. @
  221.  
  222.  
  223. 1.3
  224. log
  225. @Lint.
  226. @
  227. text
  228. @d11 1
  229. a11 1
  230. static char rcsid[] = "$Header: fcntl.c,v 1.2 88/07/29 17:39:22 ouster Exp $ SPRITE (Berkeley)";
  231. d93 11
  232. d118 3
  233. a120 7
  234.         if (value == 0) {
  235.         status = SUCCESS;
  236.         } else {
  237.         status = Fs_IOControl(fd, IOC_SET_BITS, 
  238.                 sizeof(value), (Address) &value,
  239.                 0, (Address) NULL);
  240.         }
  241. @
  242.  
  243.  
  244. 1.2
  245. log
  246. @Lint.
  247. @
  248. text
  249. @d11 1
  250. a11 1
  251. static char rcsid[] = "$Header: fcntl.c,v 1.1 88/06/19 14:31:16 ouster Exp $ SPRITE (Berkeley)";
  252. d82 1
  253. a82 1
  254.                 sizeof(temp), &temp);
  255. @
  256.  
  257.  
  258. 1.1
  259. log
  260. @Initial revision
  261. @
  262. text
  263. @d11 1
  264. a11 1
  265. static char rcsid[] = "$Header: fcntl.c,v 1.3 87/07/31 16:44:44 andrew Exp $ SPRITE (Berkeley)";
  266. d58 2
  267. a59 2
  268.                 0, NULL, 
  269.                 sizeof(value), &value);
  270. d67 2
  271. a68 2
  272.                 sizeof(value), &value,
  273.                 0, NULL);
  274. d71 2
  275. a72 2
  276.                 sizeof(value), &value,
  277.                 0, NULL);
  278. d81 1
  279. a81 1
  280.                 0, NULL, 
  281. d111 2
  282. a112 2
  283.                 sizeof(value), &value,
  284.                 0, NULL);
  285. d121 2
  286. a122 2
  287.                 0, NULL,
  288.                 sizeof(owner), &owner);
  289. d142 2
  290. a143 2
  291.                 sizeof(owner), &owner,
  292.                 0, NULL);
  293. @
  294.